/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.saber.certificacao.ejbs.stateless.interfaces;

import br.com.saber.certificacao.enums.Linguagem;
import br.com.saber.certificacao.modelos.Certificacao;
import br.com.saber.certificacao.modelos.Usuario;
import br.com.saber.certificacao.modelos.Versao;
import java.util.List;
import java.util.Set;
import javax.ejb.Local;

/**
 *
 * @author gbvbahia
 */
@Local
public interface VersaoBeanLocal {

    /**
     * Salva/Atualiza a versão no banco de dados;
     * Passe um ou mais usuários dentro de uma lista
     * e todos serão considerados como profoessores da versão.
     * Os professores que já estão vinculados a esta versão devem também
     * estar na lista para não serem removidos.
     * Para remover um vinculo com um professor passe a lista sem ele dentro, o vinculo é quebrado.
     * @param versao
     * @param professores
     */
    void salvarVersao(Versao versao, List<Usuario> professores);

    /**
     * Retorna a versão com o nome passado.
     * @param nome
     * @return Uma versão ou nulo se não encontrar.
     */
    Versao buscarVersaoPorNome(String nome);

    /**
     * Retorna todas as versões cadastradas.
     * @return
     */
    Set<Versao> buscarTodasVersoes();

    /**
     * Retorna a versão que possui o ID informado.
     * @param parameter
     * @return Uma versão ou nulo se não encontrar.
     */
    Versao buscarVersaoPorId(long parameter);

    /**
     * Retorna todas as versões que estão abaixo da certificação passada.
     * @param certificacao
     * @return Uma lista com versões ou vazia se a certificação não contiver versões.
     */
    Set<Versao> buscarVersoesPorCertificacao(Certificacao certificacao);

    /**
     * Retorna todas as versões da certificação passada limitada as visão se a versão 
     * é superior ou não.
     * @param certificacao
     * @param isMother
     * @return 
     */
    public Set<Versao> buscarVersoesPorCertificacao(Certificacao certificacao, boolean isMother);
    
    /**
     * Embora em sua nomenclatura seja professor, será retornado
     * todas as versões atrelada ao usuário passado, Coordenador,
     * professor, usuário.
     * Havendo uma ligação ProfessorVersao a versão será retornada.
     * @param professor
     * @return Havendo uma ligação ProfessorVersao a versão será retornada.
     */
    Set<Versao> buscarVersoesPorProfessor(Usuario professor);

    /**
     * Retorna todas as versões que o usuario(professor) tem acesso
     * limitado a certificação passada, versões que não sejam da Certificação
     * passada são ignoradas.
     * @param professor
     * @param certificacao
     * @return @return Havendo uma ligação ProfessorVersao a versão e a versão
     * seja da certificação informada, esta versão será retornada dentro do Set.
     */
    Set<Versao> buscarVersaoPorProfessorCertificacao(Usuario professor, Certificacao certificacao);
    /**
     * Retorna todas as versões que o usuario(professor) tem acesso
     * limitado a certificação passada, versões que não sejam da Certificação
     * passada são ignoradas. 
     * Possibilita filtro para versão superior
     * @param professor
     * @param certificacao
     * @param isMother
     * @return Lista de Versões superior ou normal.
     */
    Set<Versao> buscarVersaoPorProfessorCertificacao(Usuario professor, Certificacao certificacao, boolean isMother);

    /**
     * Retorna todas as versões que possuem no mínimo
     * a quantidade de questões cadastradas passada como 
     * parâmetro.
     * @param minQuestoes cadastradas para a versão
     * @return Set de versões
     */
    Set<Versao> buscarVersoesComMinimoQuestoes(int minQuestoes);

    /**
     * Retorna todas as versões que possuem no mínimo
     * a quantidade de questões cadastradas passada como 
     * parâmetro e que possuem a certificação informada.
     * @param minQuestoes cadastradas para a versão
     * @param certificacao filtro para versão
     * @return Set de versões dentro do perfil.
     */
    Set<Versao> buscarVersoesComMinimoQuestoes(int minQuestoes, Certificacao certificacao);

    /**
     * Retorna as versões Mother, se versaoMother for true ou
     * as subversões se versaoMother for false, que possuem no mínimo
     * a quantidade de questões cadastradas passada como 
     * parâmetro e que possuem a certificação informada.
     * @param minQuestoes
     * @param certificacao
     * @param versaoMother
     * @return Set de versões dentro do perfil.
     */
    Set<Versao> buscarVersoesComMinimoQuestoes(int minQuestoes, Certificacao certificacao, boolean versaoMother);
    
     /**
     * Conta a quantidade de questoes de uma versão baseado
     * no idioma e na versão passada.
     * Se linguagem nula conta tudo.
     * @param versao
     * @param linguagem
     * @return 
     */
    Long contarQuestoesDaVersao(Versao versao, Linguagem linguagem);
    
    /**
     * Retorna todas as versões que são marcadas <strong>mother</strong>
     * como <code>true</code> ou <code>false</code>, dependendo do 
     * parâmetro isMother
     * @param isMother
     * @return Lista de versões
     */
    List<Versao> buscarTodasVersoesPorTipo(boolean isMother, Certificacao certificacao);

        /**
     * Retorna todas as versões que são marcadas <strong>mother</strong>
     * como <code>true</code> ou <code>false</code>, dependendo do 
     * parâmetro isMother
     * @param isMother
     * @return Lista de versões
     */
    List<Versao> buscarTodasVersoesPorTipo(boolean isMother);
    
    /**
     * Contabiliza a quantidade de versões filhas que uma
     * determinada versão superior (mother) possui.
     * Se a versão não for uma Mother será retornardo 0
     * @param versaoMother
     * @return Quantidade de versões simples
     */
    Integer quantidadeDeVersoesSimples(Versao versaoMother);
    /**
     * Retorna um Set com todas as versões que são
     * filhas da versão mãe(superior) passada.
     * Se a versão não for uma Mother será retornardo null
     * @param mother
     * @return As versões filhas da Mother
     */
    Set<Versao> buscarVersoesFilhasDaMother(Versao mother);
}
